package com.meng.jingtao.coupon.rabbitmq;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.meng.common.utils.ConnectionUtils;
import com.meng.jingtao.coupon.entity.CouponEntity;
import com.meng.jingtao.coupon.service.CouponService;
import com.rabbitmq.client.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * @author xinqimeng
 * @version 1.0.0
 * @ClassName Consumer.java
 * @Description 消费者
 * @createTime 2022年02月10日 14:12:00
 */
@Component
@RefreshScope
public class Consumer {

    @Value("${rabbitmq.simple_queue}")
    private String queue;

    @Autowired
    private CouponService couponService;


    private void consumerMessage() throws Exception{
        //获取连接
        Connection connection = ConnectionUtils.getConnection();
        //创建频道
        Channel channel = connection.createChannel();
        //声明(创建)队列
        /**
         * 参数1:队列名称
         * 参数2:是否定义持久化队列
         * 参数3:是否独占本次连接
         * 参数4:是否在不使用的时候自动删除队列
         * 参数5:队列其他参数
         */
        channel.queueDeclare(queue, true, false, false, null);
        //创建消费者,并设置消息处理
        DefaultConsumer consumer = new DefaultConsumer(channel) {
            @Override
            /** consumerTag 消息者标签，在channel.basicConsume时候可以指定
             * envelope 消息包的内容，可从中获取消息id，消息routingkey，交换机，消息和重传标志 (收到消息失败后是否需要重新发送)
             * properties 属性信息 * body 消息
             */
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                //路由key
                System.out.println("路由key为：" + envelope.getRoutingKey());
                //交换机
                System.out.println("交换机为：" + envelope.getExchange());
                // 消息id
                System.out.println("消息id为：" + envelope.getDeliveryTag());
                // 收到的消息
                String message = new String(body, "utf-8");

                System.out.println("接收到的消息为：" + message);
            }
        };
        //监听消息
        channel.basicConsume(queue,true,consumer);
        //不关闭资源,应该一直监听消息
//        channel.close();
//        connection.close();



    }

    public  void init() throws Exception {
        consumerMessage();
    }

}
